/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import controller.Conexao;
import controller.Funcionario;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Alcivando
 */
public class FuncionarioDAO {

    Funcionario funcionario = new Funcionario();
    private Connection connection;
    private Conexao conexao;

    public FuncionarioDAO() throws SQLException {
        this.connection = conexao.getConnection();

    }

    public int retornaProximoID() throws SQLException {
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(codFuncionario) from funcionario;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);
        }
        return codigo.get(0);
    }

    public void adiciona(Funcionario funcionario) throws SQLException {

        // cria uma lista onde será armazenado o próximo codigo
        List<Integer> codigo = new ArrayList<Integer>();
        // cria um parametro com a consulta para pegar o proximo codigo a ser usado
        String consultaId = "SELECT max(codFuncionario)from funcionario;";
        // efetua e retorna a consultaId
        ResultSet rs = connection.createStatement().executeQuery(consultaId);
        //adiciona o codigo a lista
        while (rs.next()) {
            codigo.add(rs.getInt("max") + 1);


        }
        //adiciona o codigo ao proximo funcionario a ser inserido
        funcionario.setCodFuncionario(codigo.get(0));

        // insere os dados do funcionario com a conexao para o banco de dados.
        String sql = "insert into funcionario values (?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setInt(1, funcionario.getCodFuncionario());
        stmt.setString(2, funcionario.getNome());
        stmt.setString(3, funcionario.getRua());
        stmt.setInt(4, funcionario.getNumero());
        stmt.setString(5, funcionario.getBairro());
        stmt.setString(6, funcionario.getCidade());
        stmt.setString(7, funcionario.getCpf());
        stmt.setString(8, funcionario.getTelefone());
        stmt.setString(9, funcionario.getObs());
        stmt.setString(10, funcionario.getUf());
        stmt.setString(11, funcionario.getComplemento());
        stmt.setString(12, funcionario.getCep());


        // busca os campos preenchidos na classe de Clientes.

        stmt.execute();
        JOptionPane.showMessageDialog(null, "O Funcionário foi salvo com sucesso!", "Cadastro Concluído", 1);
        stmt.close();
        // executa e finaliza o processo de adicionar.*/
    }

    public ArrayList<Funcionario> RetornaTodosFuncionario() {
        Statement comando;
        ArrayList<Funcionario> listaFuncionario = new ArrayList<Funcionario>();

        try {

            String sql = "SELECT * FROM funcionario";
            comando = connection.createStatement();
            ResultSet rs = comando.executeQuery(sql);

            while (rs.next()) {

                Funcionario f = new Funcionario();

                f.setCodFuncionario(rs.getInt("codFuncionario"));
                f.setNome(rs.getString("nome"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setCpf(rs.getString("cpf"));
                f.setTelefone(rs.getString("telefone"));
                f.setObs(rs.getString("observacoes"));
                f.setUf(rs.getString("uf"));
                f.setComplemento(rs.getString("complemento"));
                f.setCep(rs.getString("cep"));

                listaFuncionario.add(f);

            }
            comando.close();

            return listaFuncionario;

        } catch (SQLException ex) {
         
            return null;
        }
    }

    public void remover(Funcionario funcionario) throws SQLException {
        PreparedStatement comando;
        try {
            String sql = "DELETE FROM funcionario WHERE codFuncionario=?";
            comando = connection.prepareStatement(sql);
            comando.setInt(1, funcionario.getCodFuncionario());
            comando.execute();
            JOptionPane.showMessageDialog(null, "O Funcionário foi removido com sucesso!", "Remoção Concluída", 1);
            comando.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public void atualizar(Funcionario funcionario) {
        PreparedStatement comando;

        try {

            String sql = "UPDATE funcionario SET nome = ?, rua  = ?, numero = ?, bairro  = ?, cidade  = ?, cpf  = ?, cep  = ?, uf  = ?, observacoes  = ?, telefone  = ?, complemento  = ?WHERE codFuncionario = " + funcionario.getCodFuncionario() + ";";

            comando = connection.prepareStatement(sql);

            comando.setString(1, funcionario.getNome());
            comando.setString(2, funcionario.getRua());
            comando.setInt(3, funcionario.getNumero());
            comando.setString(4, funcionario.getBairro());
            comando.setString(5, funcionario.getCidade());
            comando.setString(6, funcionario.getCpf());
            comando.setString(7, funcionario.getCep());
            comando.setString(8, funcionario.getUf());
            comando.setString(9, funcionario.getObs());
            comando.setString(10, funcionario.getTelefone());
            comando.setString(11, funcionario.getComplemento());




            comando.executeUpdate();
            JOptionPane.showMessageDialog(null, "O Funcionário foi alterado com sucesso!", "alteraçao Concluída", 1);
            comando.close();

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public ArrayList<Funcionario> retornaFuncionarioPorCod(int cod) {

        PreparedStatement comando;
        ArrayList<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
        try {

            String sql = "SELECT * FROM funcionario WHERE codFuncionario = ?";

            comando = connection.prepareStatement(sql);

            comando.setInt(1, cod);

            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.




            while (rs.next()) {

                Funcionario f = new Funcionario();

                f.setCodFuncionario(rs.getInt("codFuncionario"));
                f.setNome(rs.getString("nome"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setCpf(rs.getString("cpf"));
                f.setTelefone(rs.getString("telefone"));
                f.setObs(rs.getString("observacoes"));
                f.setUf(rs.getString("uf"));
                f.setComplemento(rs.getString("complemento"));
                f.setCep(rs.getString("cep"));

                listaFuncionario.add(f);

            }

            comando.close();
            return listaFuncionario;

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Funcionario> retornaFuncionarioPorNome(String nome) {

        PreparedStatement comando;
        ArrayList<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
        try {

            String sql = "SELECT * FROM funcionario WHERE nome LIKE ?";

            comando = connection.prepareStatement(sql);

            comando.setString(1, nome + "%");

            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.




            while (rs.next()) {

                Funcionario f = new Funcionario();

                f.setCodFuncionario(rs.getInt("codFuncionario"));
                f.setNome(rs.getString("nome"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setCpf(rs.getString("cpf"));
                f.setTelefone(rs.getString("telefone"));
                f.setObs(rs.getString("observacoes"));
                f.setUf(rs.getString("uf"));
                f.setComplemento(rs.getString("complemento"));
                f.setCep(rs.getString("cep"));
                listaFuncionario.add(f);

            }

            comando.close();
            return listaFuncionario;

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }

    public ArrayList<Funcionario> retornaFuncionarioPorCpf(String cpf) {

        PreparedStatement comando;
        ArrayList<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
        try {

            String sql = "SELECT * FROM funcionario WHERE cpf LIKE ?";

            comando = connection.prepareStatement(sql);

            comando.setString(1, cpf + "%");

            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.




            while (rs.next()) {

                Funcionario f = new Funcionario();

                f.setCodFuncionario(rs.getInt("codFuncionario"));
                f.setNome(rs.getString("nome"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setCpf(rs.getString("cpf"));
                f.setTelefone(rs.getString("telefone"));
                f.setObs(rs.getString("observacoes"));
                f.setUf(rs.getString("uf"));
                f.setComplemento(rs.getString("complemento"));
                f.setCep(rs.getString("cep"));
                listaFuncionario.add(f);

            }

            comando.close();
            return listaFuncionario;

        } catch (Exception sqle) {
         
            return null;
        }
    }

    public Funcionario retornaFuncionarioPorCodigo(int cod) {
        PreparedStatement comando;
 ArrayList<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
        try {

            String sql = "SELECT * FROM funcionario WHERE codfuncionario = ?";

            comando = connection.prepareStatement(sql);
           
            comando.setInt(1, cod);

            ResultSet rs = comando.executeQuery(); //associado as operações de insert,delete,update.



            while (rs.next()) {

                Funcionario f = new Funcionario();

                f.setCodFuncionario(rs.getInt("codFuncionario"));
                f.setNome(rs.getString("nome"));
                f.setRua(rs.getString("rua"));
                f.setNumero(rs.getInt("numero"));
                f.setBairro(rs.getString("bairro"));
                f.setCidade(rs.getString("cidade"));
                f.setCpf(rs.getString("cpf"));
                f.setTelefone(rs.getString("telefone"));
                f.setObs(rs.getString("observacoes"));
                f.setUf(rs.getString("uf"));
                f.setComplemento(rs.getString("complemento"));
                f.setCep(rs.getString("cep"));

                listaFuncionario.add(f);

            }

            comando.close();
            return listaFuncionario.get(0);

        } catch (Exception sqle) {
            sqle.printStackTrace();
            return null;
        }
    }
}
